perm filename CONTXT.MAC[11,HE] blob
sn#494240 filedate 1982-04-29 generic text, type T, neo UTF8
; Copyright Xerox Corporation 1979
.TITLE CONTXT
.DSABL GBL
.CSECT GLOBAL
G=.
.=G+125.+125.
.WORD INCON
.WORD CALCON
.WORD BLOCK
.CSECT
;
;CONTEXT DATA STRUCTURE
;
NEXT=0 ;FORWARD LINK TO NEXT CONTEXT
STACK=2 ;SAVED STACK POINTER (R0)
PROC=4 ;PROCEDURE STARTING ADDRESS
EXSPAC=6 ;SPACE FOR PASSING ARGUMENTS
;
;STACK FOR USE OF THIS ROUTINE
;
MYSTAK: .WORD STKEND ;SAVED STACK POINTER
.BLKW 20. ;STACK
STKEND=. ;END OF STACK
.PAGE
;
;SUBROUTINE INITIALIZECONTEXT(REGION,LENGTH,PROC,EXTRASPACE) = CTX
;
INCON::
MOV R1,-(SP)
ASL R1
CLR NEXT(R1) ;NO FWD LINK
ASL R2 ;LENGTH I DACTES
ADD R1,R2 ;END OF REGION
MOV #START,-(R2) ;PUSH STARTING ADDRESS
MOV R2,STACK(R1) ;SAVE STACK POINTER
MOV R3,PROC(R1) ;SAVE PROC STARTING ADDRESS
MOV (SP)+,R1 ;R1 = CTX POINTER
ADD #2,(SP)
RTS PC ;RETURN
.PAGE
;
;SUBROUTINE CALLCONTEXTLIST(CTX)
;
CALCON::
SUB @0(SP),R0 ;
MOV (SP)+,-(R0) ;
MOV R0,R3 ;SAVE CALLER'S STACK POINTER
MOV MYSTAK,R0 ; IN MY STACK
MOV R3,-(R0) ;PUSH R3(CALLER'S R0)
BR NXTCTX ;EXECUTE FIRST CONTEXT
;
;SUBROUTINE BLOCK()
;
BLOCK::
SUB @0(SP),R0 ;
MOV (SP)+,-(R0) ;
MOV R0,R3 ;SAVE CALLER'S STACK POINTER
MOV MYSTAK,R0 ; IN HIS CONTEXT AREA
MOV (R0)+,R1 ;PULL ADDR OF RUNNING CONTEXT
MOV R3,STACK(R1) ;
MOV NEXT(R1),R1 ;GET NEXT CONTEXT ON QUEUE
BEQ DONCTX ;NO MORE ON LIST TO RUN
;
;RESUME NEXT CONTEXT ON LIST
;
NXTCTX:
ASL R1 ;
MOV R1,-(R0) ;PUSH ADDR OF RUNNING CONTEXT
MOV R0,MYSTAK ;SAVE MY STACK POINTER
MOV STACK(R1),R0 ;SETUP CONTEXT STACK POINTER
MOV (R0)+,R5 ;RESUME PROC(CTX)
ADD (R5)+,R0
JMP (R5)
;
;RETURN TO CALLER AFTER LAST CONTEXT ON QUEUE
;
DONCTX:
MOV (R0)+,R3 ;PULL CALLER'S STACK POINTER
MOV R0,MYSTAK ; FROM MY STACK
MOV R3,R0 ;SETUP CALLER'S STACK POINTER
MOV (R0)+,R5 ;RETURN TO CALLER
ADD (R5)+,R0
JMP (R5)
;
;ROUTINE FOR STARTING AND RESTARTING A PROCEDURE
;
RESTRT:
MOV @MYSTAK,R2 ;R2 = CTX ADDRESS
MOV R2,R1 ;
CLC ;
ROR R1 ;R1 = CTX POINTER
JSR PC,@PROC(R2) ;EXECUTE PROCEDURE
.WORD 0
START=.-2 ;ROUTINE RETURNS HERE
BR RESTRT ;RESTART IF PROC RETURNS
.END